home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / Goodies / CallBack / SOURCE / SVRMAIN.CPP < prev    next >
C/C++ Source or Header  |  1996-05-29  |  4KB  |  187 lines

  1. /*
  2. *   Visual Basic Callback Server Source
  3. *
  4. *   (c) Copyright Microsoft Corp. 1995 All Rights Reserved
  5. */ 
  6.  
  7. #include "hostenv.h"
  8. #include "CBackODL.h"
  9. #include "CBackGen.h"
  10.  
  11. HINSTANCE g_hinst;
  12. ULONG g_cObj=0;
  13. ULONG g_cLock=0;
  14. BOOL (WINAPI *VBInBreakMode)(void) = NULL;
  15. HINSTANCE hinstVBBrk = NULL;
  16.  
  17. void Initialize()
  18. {
  19.     #ifdef WIN32
  20.   UINT fuOldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
  21.     if (hinstVBBrk = LoadLibrary(SYSSTR("VBBrk32.dll")))
  22.     #else
  23.     if (hinstVBBrk = LoadLibrary(SYSSTR("VBBrk16.dll")))
  24.     #endif
  25.         VBInBreakMode = GetProcAddress(hinstVBBrk, SYSSTR("VBInBreakMode"));
  26.   #ifdef WIN32
  27.   SetErrorMode(fuOldMode);
  28.   #endif
  29.     return;        
  30. }
  31. void Uninitialize()
  32. {
  33.     if (hinstVBBrk)
  34.         FreeLibrary(hinstVBBrk);
  35. }
  36. #ifdef WIN32
  37. BOOL APIENTRY
  38. LibMain(HINSTANCE hinst, DWORD dw, LPVOID lp)
  39. {
  40.     switch (dw)
  41.         {
  42.            case DLL_PROCESS_ATTACH:
  43.             g_hinst = hinst;
  44.             Initialize();
  45.             break;
  46.         case DLL_PROCESS_DETACH:
  47.             Uninitialize();
  48.             break;            
  49.         case DLL_THREAD_ATTACH:
  50.         case DLL_THREAD_DETACH:
  51.         default:
  52.             break;
  53.         }
  54.     return TRUE;
  55. }
  56. #else
  57. /*LibMain*/
  58. int PASCAL LibMain(HINSTANCE hinst, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine)
  59. {
  60.     if (cbHeapSize != 0)
  61.         UnlockData(0);
  62.     g_hinst = hinst;
  63.     Initialize();
  64.     return hinst;
  65. }
  66. /*WEP*/
  67. extern "C"
  68. int FAR PASCAL WEP(int bSystemExit)
  69. {
  70.     Uninitialize();
  71.     return 1;
  72. }            
  73.  
  74. #endif
  75.  
  76. /*DllGetClassObject
  77. *
  78. *
  79. *
  80. *  This is called by OLE when the server is Created through an inproc line in the registry
  81. */                                                                                        
  82. HRESULT FAR PASCAL DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv)
  83. {
  84.     LPCLASSFACTORY pcf = NULL;
  85.     *ppv = NULL;
  86.     
  87.     if (IsEqualCLSID(rclsid, CLSID_CallBackGenerator))
  88.         pcf = new CCBGeneratorCF;
  89.     else
  90.         return ResultFromScode(E_FAIL);
  91.     if (!pcf)
  92.         return ResultFromScode(E_OUTOFMEMORY);
  93.     
  94.     pcf->AddRef();
  95.     *ppv = pcf;
  96.     return NOERROR;
  97. }               
  98.  
  99. /*DllCanUnloadNow.  Called by OLE to see if it can unload the DLL*/
  100. STDAPI DllCanUnloadNow(void)
  101. {
  102.     if (g_cObj == 0L && g_cLock == 0L)
  103.         return ResultFromScode(S_OK);
  104.     return ResultFromScode(S_FALSE);
  105. }
  106.  
  107. STDAPI DllRegisterServer(void)
  108. {
  109.   ITypeLib FAR* ptlib = NULL;
  110.   HRESULT hr;
  111.     SYSCHAR szSysFileName[128];
  112.     LPOLESTR lpOleFileName;
  113.     DWORD dwLen;
  114.     // If it wasn't registered, load the typelib from the resource in the DLL.
  115.     dwLen = GetModuleFileName(g_hinst, szSysFileName, 128);
  116.     lpOleFileName = OLESYSSTR(szSysFileName);
  117.     if FAILED(hr = LoadTypeLib(lpOleFileName, &ptlib))
  118.         {
  119.         FREESTR(lpOleFileName);
  120.         return hr;
  121.         }
  122.     else
  123.         {
  124.         hr = RegisterTypeLib(ptlib, lpOleFileName, NULL);
  125.         FREESTR(lpOleFileName);
  126.         if FAILED(hr)
  127.       {
  128.             ptlib->Release();
  129.             return hr;
  130.       }
  131.         }
  132.     ptlib->Release();
  133.     HKEY hkey;
  134.     #ifdef WIN32
  135.     DWORD dwDisposition;
  136.     RegCreateKeyEx(HKEY_CLASSES_ROOT,
  137.                    SYSSTR("CLSID\\{10679783-9B4B-11CE-BE8C-00AA004C835D}\\InprocServer32"), 
  138.                    NULL, SYSSTR(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, 
  139.                    &hkey, &dwDisposition);
  140.     RegSetValueEx(hkey, NULL, NULL, REG_SZ, (const unsigned SYSCHAR *) szSysFileName, dwLen + 1);
  141.     #else
  142.     RegCreateKey(HKEY_CLASSES_ROOT,
  143.                  SYSSTR("CLSID\\{10679783-9B4B-11CE-BE8C-00AA004C835D}\\InprocServer"),
  144.                  &hkey);
  145.     RegSetValue(hkey, NULL, REG_SZ, szSysFileName, dwLen + 1);
  146.     #endif
  147.     RegCloseKey(hkey);
  148.     return NOERROR;
  149. }
  150.  
  151. HRESULT LoadResourceTypeLib(REFIID libid, REFIID riid, ITypeInfo FAR* FAR* ppTInfo)
  152. {
  153.     ITypeLib FAR* ptlib = NULL;
  154.     HRESULT hr;
  155.  
  156.     if (*ppTInfo)
  157.         {
  158.         (*ppTInfo)->Release();
  159.         *ppTInfo = NULL;
  160.         }
  161.     //Version set at 1.0, check here if necessary.
  162.     if( (hr = LoadRegTypeLib(libid, 1, 0, 0, &ptlib)) != NOERROR )
  163.         {
  164.         SYSCHAR szSysFileName[128];
  165.         LPOLESTR lpOleFileName;
  166.         // If it wasn't registered, load the typelib from the resource in the DLL.
  167.         GetModuleFileName(g_hinst, szSysFileName, 128);
  168.         lpOleFileName = OLESYSSTR(szSysFileName);
  169.         if( (hr = LoadTypeLib(lpOleFileName, &ptlib)) != NOERROR)
  170.             {
  171.             FREESTR(lpOleFileName);
  172.             return hr;
  173.             }
  174.         else
  175.             {
  176.             hr = RegisterTypeLib(ptlib, lpOleFileName, NULL);
  177.             FREESTR(lpOleFileName);
  178.             if (hr != NOERROR)
  179.                 return hr;
  180.             }
  181.         }
  182.  
  183.     hr = ptlib->GetTypeInfoOfGuid(riid, ppTInfo);
  184.     ptlib->Release();
  185.     return hr;
  186. }
  187.